import React from 'react';
import {AsyncStorage} from 'react-native';
// npm install react-native-storage --save
import Storage from 'react-native-storage';
// 导入Aes加密工具类
import AesUtil from './../encrypt/AesEncrypt';

class LocalStorage extends Storage {
	/**
	 * 存储数据
	 * @param params 参数
	 */
	save(params) {
		// console.log(params);
		// 加密key
		if (params.hasOwnProperty("key")) {
			let key = params.key;
			// 设置加密后的数据
			params.key = AesUtil.encrypt(key)
		}
		// 加密data
		if (params.hasOwnProperty("data")) {
			let data = params.data;
			let keys = Object.keys(data);
			// 遍历所有的key
			for (let i in keys) {
				// 获取键值
				let key = keys[i];
				let value = data[key];
				// 加密键值
				// let encryptKey = AesUtil.encrypt(key);
				// 设置对应键的值
				data[key] = AesUtil.encrypt(value);
			}
			// console.log("encrypt: " + JSON.stringify(data));
			// 设置加密后的数据
			params.data = data
		}
		// console.log(params);
		super.save(params);
	}
	
	/**
	 * 加载数据
	 * @param params 参数列表
	 */
	load(params) {
		// console.log(params);
		// 加密key
		if (params.hasOwnProperty("key")) {
			let key = params.key;
			// 设置加密后的数据
			params.key = AesUtil.encrypt(key)
		}
		// console.log(params);
		// 加载数据
		return new Promise((resolve, reject) => {
			return super.load(params).then(data => {
				// 如果找到数据，解密
				let keys = Object.keys(data);
				// 遍历所有的key
				for (let i in keys) {
					// 获取键值
					let key = keys[i];
					let value = data[key];
					// 加密键值
					// let encryptKey = AesUtil.encrypt(key);
					// 设置对应键的值
					data[key] = AesUtil.decrypt(value);
				}
				// console.log("en-data: " + JSON.stringify(data));
				return resolve(data)
			}).catch(reason => {
				reject(reason)
			})
		});
	}
	
	removeItem(key) {
		return super.removeItem(AesUtil.encrypt(key))
	}
}

const storage = new LocalStorage({
	// 容量
	size: 1000,
	// RN 使用 AsyncStorage
	storageBackend: AsyncStorage,
	// 有效时间
	defaultExpires: 1000 * 3600 * 24,
	// 缓存数据在内存中
	enableCache: true,
	// 数据过期时调用
	sync: {}
});

// RN
global.storage = storage;

//在这里设置`storage.sync`
// storage.sync = require('./RNAsyncStorage_asyn').xxxx;